# A.4.3 节代码：async_api_sim.py
import asyncio
import time


# 1. 模拟一个简单的装饰器 (用于注册路由)
def route_decorator(path):
	def decorator(func):
		print(f"路由已注册: {path} -> 函数: {func.__name__}")
		return func

	return decorator


# 2. 模拟一个耗时的异步操作 (例如：等待 LLM 思考)
async def llm_thinking_simulation(user_id: str):
	"""
	模拟 LLM 思考 2 秒钟的耗时操作。
	"""
	print(f"[{user_id}] 请求开始，思考...")
	# asyncio.sleep(2) 是一个异步等待，它不会阻塞整个程序
	await asyncio.sleep(2)
	print(f"[{user_id}] 思考结束。")
	return f"AI Response from {user_id}."


# 3. 异步 API 路由函数 (使用装饰器和 await)
@route_decorator("/api/chat")
async def handle_chat_request(user_id: str):
	"""
	模拟 FastAPI 路由处理函数。
	"""
	# 使用 await 等待 LLM 思考，同时让出 CPU 给其他任务
	response = await llm_thinking_simulation(user_id)
	print(f"[{user_id}] 响应准备就绪。")
	return response


# --- 主程序执行部分 (模拟并发请求) ---
if __name__ == "__main__":
	start_time = time.time()
	print("--- 模拟 FastAPI 启动 ---")
	# 模拟 3 个用户同时发送请求
	tasks = [
		handle_chat_request("User_A"),
		handle_chat_request("User_B"),
		handle_chat_request("User_C"),
	]
	# asyncio.run 启动异步事件循环，并等待所有任务完成
	# 关键：所有任务将并行运行
	async def _main():
		return await asyncio.gather(*tasks)

	results = asyncio.run(_main())
	end_time = time.time()
	print("\n--- 最终结果 ---")
	print(f"总耗时: {end_time - start_time:.2f} 秒 (预期接近 2.00 秒)")
	# 预期总耗时接近 2 秒，而不是 6 秒 (3 * 2秒)